#pragma once
#include <deque>
#include <string>
#include <vector>

namespace GiSo {


class Buffer {
public:
    Buffer();
    ~Buffer();

    // 写入数据到 Buffer 末尾 (线程安全 - 写锁)
    bool Append(const void* data, size_t len);
    bool Append(const std::string& str);

    // 从 Buffer 前端弹出数据 (线程安全 - 写锁)
    void PopFront(size_t len);

    // 拷贝 Buffer 内容到 std::vector<char> (线程安全 - 读锁)
    std::vector<char> CopyToVector() const;

    // 拷贝 Buffer 内容到 std::string (线程安全 - 读锁)
    std::string CopyToString() const;

    // Assign to String
    void AssignToString(std::string& str) const;

    // 清空 Buffer
    void Clear();

    // 查询可读字节数
    size_t ReadableBytes() const;

    // 查询可写空间
    size_t WritableBytes() const;

    // 判断 Buffer 是否为空 (线程安全 - 读锁)
    bool isEmpty() const;

private:
    std::deque<char> m_Buffer; // 使用 std::deque<char> 作为底层数据结构
    static const size_t s_InitialSize = 65536; // buffer的最大容量是64KB
};

}